进程死锁——银行家算法

死锁概念

  一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到该资源,这种现象称为进程死锁(Deadlock),这一组进程就称为死锁进程

1、死锁产生的原因

  • 竞争资源引起进程死锁(资源分配策略)(可剥夺和非剥夺资源)
  • 进程推进顺序不当引起死锁

PS:关于死锁的一些结论:

  • 参与死锁的进程最少是两个(两个以上进程才会出现死锁)
  • 参与死锁的进程至少两个已经占有资源
  • 参与死锁的所有进程都在等待资源
  • 参与死锁的进程是当前系统中所有进程的子集
  • 如果死锁发生,会浪费大量的系统资源,甚至导致系统崩溃

2、死锁的四个必要条件

  • 互斥条件:设计的资源是非共享的
  • 不可抢占条件:不能强行剥夺进程拥有的资源
  • 请求和保持条件:进程在等待一新资源时继续占有已分配的资源
  • 环路条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被下一个进程所请求


3、处理死锁的方法

  • 预防死锁:通过设置某些限制条件,去破坏死锁四个必要条件中的一个或多个,来防止死锁。
  • 避免死锁:不事先设置限制条件去破坏产生死锁的条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。
  • 检测死锁允许死锁发生,但可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除掉。
  • 解除死锁:与检测死锁相配套,用于将进程从死锁状态解脱出来。常用的方法是撤消或挂起一些进程。以回收一些资源,再将它们分配给处于阻塞状态的进程,使之转为就绪状态

4、避免死锁——银行家算法

  • 可利用资源向量Available。它是一个含有 m个元素的数组,其中每个元素代表一类 可利用资源的数目。
  • 最大需求矩阵Max。n*m矩阵,表示n个进程的每一个对m类资源的最大需求。
  • 分配矩阵Allocation 。n*m矩阵,表示每个进程已分配的每类资源的数目。
  • 需求矩阵Need 。n*m矩阵,表示每个进程还需要各类资源数。

银行家算法步骤:

当进程Pi提出资源申请时,执行下列步骤:

(1)若Requesti[j]≤Need[i,j],转(2);
          否则错误返回
(2)若Requesti[j] ≤Available[j],

          转(3);否则进程等待

(3)假设系统分配了资源,则有:
       Available [j] :=Available [j] -Requesti[j];
        Allocation[i,j]:=Allocation[i,j]+Requesti[j];
        Need[i,j]:=Need[i,j]-Requesti[j]
(4)执行安全性算法。
       若系统新状态是安全的,则完成分配;

       若系统新状态是不安全的,则恢复原状态,进程等待


安全性算法步骤:

(1) Work[j]:=Available[j];

      Finish[i]:=false;
(2) 寻找满足下列条件的i:
      a).  Finish[i]=false;
      b).  Need[i,j]≤Work[j];

  如果不存在,则转(4)

(3) Work[j] :=Work[j]+Allocation[i,j];
      Finish[i]:=true;
      转(2)

(4) 若对所有i,Finish[i]=true,则系统处于安全状态,否则处于不安全状态



可得:      Need[i,j]= Max[i,j]- Allocation[i,j]

例:

设系统有五个进程和三类资源,每类资源分别有10、5、7。在T0时刻资源分配情况如下:


T0时刻可以找到一个安全序列<P1, P3, P4, P2, P0>,系统是安全的。


P1发出请求Request(1,0,2),执行银行家算法


可以找到一个安全序列{P1,P3,P4,P0,P2},系统是安全的,可以将P1请求资源分配给它。


若是:P4发出请求Request(3,3,0), 执行银行家算法
Available=(2 3 0)

不能通过算法第2步( Requesti[j]≤Available[j] ),所以P4等待。

例:如下:若P0发出请求Request(0,2,0),执行银行家算法


Available{2,1,0}已不能满足任何进程需要,所以系统进入不安全状态,P0的请求不能分配。

练习题:有三类资源A(17)、B(5)、C(20)。有5个进程P1~P5。T0时刻系统状态如下:


问:
(1)、T0时刻是否为安全状态,给出安全系列。
(2)、T0时刻,P2: Request(0,3,4),能否分配,为什么?
(3)、在(2)的基础上P4:Request(2,0,1),能否分配,为什么?
(4)、 在(3)的基础上P1:Request(0,2,0),能否分配,为什么?  

解:(1) T0时刻的出安全系列

先求出Need和Work




(2)  P2: Request(0,3,4)

因(Available =2 3 3)< Request(0,3,4) 所以不能分配。

(3)  P4:Request(2,0,1)       Available =2 3 3


有安全序列P4 P5 P3 P2 P1 可以分配


(4)  P1:Request(0,2,0)


0  1  2 已不能满足任何进程的需要,不能分配


  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
银行家算法是一种经典的避免死锁算法,它可以确保系统在分配资源时不进入死锁状态。该算法主要分为两个过程:安全性检查和资源分配。 安全性检查: 在系统运行时,银行家算法需要进行安全性检查,以确定当前状态是否安全安全状态指的是系统可以满足所有进程的资源需求,而不陷入死锁状态。 实现该算法需要维护以下数据结构: - Available:表示系统中可用的资源数目。 - Allocation:表示已经分配给各个进程的资源数目。 - Need:表示每个进程还需要的资源数目。 具体实现过程如下: 1. 初始化工作: 首先,需要计算出每个进程的所需资源数目,即 Need 数组。这可以通过计算 Max - Allocation 来得到,其中 Max 表示进程所需的最大资源数目。 2. 安全性检查: 银行家算法安全性检查基于两个概念:安全序列和安全状态。 安全序列:指的是一系列进程的执行顺序,这些进程都能够完成任务,不进入死锁状态。 安全状态:指的是系统可以分配资源,使得所有进程都能够完成任务,不进入死锁状态。 安全性检查的具体实现过程如下: (1)初始化工作: 设置 Work 数组为 Available 数组的值;Finish 数组的值都为 false。 (2)循环检查: 循环检查所有进程,找到一个满足以下条件的进程: - Finish[i] = false - Need[i] <= Work 如果找到了这样的进程,则将该进程的资源释放,并将它加入安全序列中。同时,更新 Work 数组的值。 如果没有找到这样的进程,则说明系统无法满足所有进程的资源需求,进入死锁状态。 3. 资源分配: 如果系统处于安全状态,则可以进行资源分配。资源分配的过程需要按照以下规则进行: - 判断是否能够满足当前进程的资源需求(即 Need[i] <= Available)。 - 如果可以满足,则将资源分配给该进程,同时更新 Available 和 Allocation 数组的值。 - 如果无法满足,则该进程必须等待资源。 需要注意的是,资源分配过程中,需要检查是否破坏系统的安全状态。如果分配资源后,系统无法保持安全状态,则应该撤销分配操作,等待系统恢复到安全状态后再进行分配。 综上所述,银行家算法是一种非常重要的避免死锁算法。通过合理地分配系统资源,可以避免系统陷入死锁状态,提高系统的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DiuDiu_yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值